/*
 * @Descripttion: 函数防抖
 * @version: 1.0.0
 * @Author: 某人
 * @Date: 2021-05-06 17:02:32
 */

/**
 * @name: 函数防抖
 * @desc: 简易版本 满足基础要求
 * @param {*} func 执行的函数
 * @param {*} wait 等待时间
 */
// function debounce(func, wait) {
//   let timeout
//   return function () {
//     let context = this
//     let args = arguments
//     clearTimeout(timeout)
//     timeout = setTimeout(() => {
//       func.apply(context, args)
//     }, wait)
//   }
// }
/**
 * @name: 函数防抖
 * @desc: 防抖完整版本 包含取消、立即执行、函数返回值
 * @param {function} func 执行的函数
 * @param {number} wait 等待时间
 * @param {Boolean} immediate 是否立即执行
 * @return {*} func函数返回值
 */
function debounce(func, wait, immediate) {
  let timeout, result
  let debounced = function () {
    let context = this
    let args = arguments
    if (timeout) {
      clearTimeout(timeout)
    }
    if (immediate) {
      let callNow = !timeout
      timeout = setTimeout(() => {
        timeout = null
      }, wait)
      if (callNow) result = func.apply(context, args)
    } else {
      timeout = setTimeout(function () {
        func.apply(context, args)
      }, wait)
    }
  }
  debounced.cancel = () => {
    clearTimeout(timeout)
    timeout = null
  }
  return debounced
}